package no.dusken.aranea.admin.control;
import no.dusken.aranea.model.*;
import no.dusken.aranea.service.*;
import no.dusken.aranea.util.ImageUtils;
import no.dusken.common.service.GenericService;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;
/**
* @author Marvin B. Lillehaug <lillehau@underdusken.no>
*/
public class UploadControllerTest {
@InjectMocks
private ImageUploadController controller;
private File workFolder;
@Mock
private TagService tagService;
@Mock
private PersonService personService;
@Mock
private ImageService imageService;
@Mock
private StoreImageService storeImageService;
@Mock
private PageService pageService;
@Mock
private GenericService<PageImage> pageImageService;
@Mock
private ImageUtils imageUtils;
private MockMultipartFile mockMultipartFile;
@Before
public void setUp() throws Exception {
mockMultipartFile = new MockMultipartFile("File", "file2.jpg","img", new byte[]{1,2, 3, 4,5, 66, 7, 7, 8, 9, 77, 8,9, 0} );
controller = new ImageUploadController();
String property = System.getProperty("java.io.tmpdir");
File tmp = new File(property);
controller.setTmpFolder(tmp);
workFolder = new File(tmp, controller.getClass().getSimpleName());
MockitoAnnotations.initMocks(this);
}
@Test
public void testInit(){
assertFalse("Workdir already existed", workFolder.exists());
controller.init();
assertTrue("Workdir did not exist", workFolder.exists());
}
@Test
public void testUpload() throws IOException {
controller.init();
long files = workFolder.list().length;
assertEquals("folder contained files", 0, files);
MockMultipartFile file = mockMultipartFile;
String view = controller.upload(file);
files = workFolder.list().length;
assertEquals("folder contained files", 1, files);
}
@Test
public void testHandleUploaded() throws IOException {
controller.init();
controller.upload(mockMultipartFile);
List<Person> persons = new LinkedList<Person>();
List<Tag> tags = new LinkedList<Tag>();
when(personService.getPersons()).thenReturn(persons);
when(tagService.getTags()).thenReturn(tags);
Model model = new ExtendedModelMap();
String view = controller.handleUploadedFiles(model, null);
assertEquals("Wrong view", "no/dusken/aranea/base/admin/image/imageUpload", view);
assertTrue("Number of files missing", model.containsAttribute("numberOfFiles"));
assertEquals("Wrong tags", tags, model.asMap().get("tags"));
assertEquals("Wrong persons", persons, model.asMap().get("persons"));
assertEquals("Wrong number of files", new Integer(1), model.asMap().get("numberOfFiles"));
assertEquals("Wrong filename", "file2.jpg", model.asMap().get("filename"));
assertNotNull("No encodedImage", model.asMap().get("encodedImage"));
}
@Test
public void testNoFiles(){
controller.init();
Model model = new ExtendedModelMap();
String view = controller.handleUploadedFiles(model, null);
assertEquals("Wrong view", "no/dusken/aranea/base/admin/image/imageUpload", view);
assertEquals("noFiles", 0, model.asMap().get("numberOfFiles"));
}
@Test
public void testHandleFile() throws IOException {
controller.init();
MockMultipartFile file2 = new MockMultipartFile("File", "file.jpg","img", new byte[]{1,2, 3, 4,5, 66, 7, 7, 8, 9, 77, 8,9, 0} );
controller.upload(mockMultipartFile);
controller.upload(file2);
Image image = new Image();
image.setID(12L);
when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image);
when(storeImageService.createImage(Matchers.<File>anyObject())).thenReturn(image);
ImageUploadController.ImageResponse ir = controller.handleUploadedFile("file.jpg", new Person(), "", false, new LinkedList<Tag>(), "image", null, null, 0);
Long newObjectId = ir.newImageId;
Boolean isPageImage = ir.isPageImage;
String nextFile = ir.nextFileName;
String encodedImage = ir.encodedImage;
assertEquals("Wrong ID", image.getID(), newObjectId);
assertEquals("Wrong isPageImage", false, isPageImage);
assertEquals("Wrong file", "file2.jpg", nextFile);
assertNotNull("Encoded Image was null", encodedImage);
}
@Test
public void testHandlePageImage() throws IOException {
controller.init();
controller.upload(mockMultipartFile);
Image image = new Image();
image.setID(12L);
when(imageService.saveOrUpdate(Matchers.<Image>anyObject())).thenReturn(image);
when(storeImageService.createImage(Matchers.<File>anyObject())).thenReturn(image);
Article a = new Article();
a.setID(13L);
PageImage pi = new PageImage();
pi.setID(14L);
when(pageImageService.saveOrUpdate(Matchers.<PageImage>anyObject())).thenReturn(pi);
File f = new File(workFolder, "file2.jpg");
assertTrue("File did not exist", f.exists());
ImageUploadController.ImageResponse ir = controller.handleUploadedFile("file2.jpg", new Person(), "", false, new LinkedList<Tag>(), "image", a, "", 0);
Long newObjectId = ir.newImageId;
Boolean isPageImage = ir.isPageImage;
Long pageImageId = ir.newPageImageId;
String next = ir.nextFileName;
String nextEncoded = ir.encodedImage;
assertEquals("Wrong ID", image.getID(), newObjectId);
assertEquals("Wrong ID", pi.getID(), pageImageId);
assertEquals("Wrong isPageImage", true, isPageImage);
assertFalse("File was not deleted", f.exists());
assertNull("There should be no next file", next);
assertNull("There should be no next file", nextEncoded);
}
@Test
public void testUpdateAlreadyUpdatedFile() throws IOException {
controller.init();
Article a = new Article();
a.setID(13L);
PageImage pi = new PageImage();
pi.setID(14L);
when(pageImageService.saveOrUpdate(Matchers.<PageImage>anyObject())).thenReturn(pi);
File f = new File(workFolder, "file2.jpg");
assertFalse("File did not exist", f.exists());
ImageUploadController.ImageResponse ir = controller.handleUploadedFile("file.jpg", new Person(), "", false, new LinkedList<Tag>(), "image", a, "", 0);
assertEquals("ID should have been 0", new Long(0), ir.newImageId);
assertFalse("IsPageImage should have been false", ir.isPageImage);
}
@Before
public void after(){
if(workFolder.exists()){
for (File f : workFolder.listFiles()){
f.delete();
}
workFolder.delete();
}
}
}